<?php
/************************************************************************************************
 * 																								*
 * Autor: Dariusz Janik																			*
 * Data utworzenia: 22.10.2012																	*
 * Data ostatniej modyfikacji: 5.12.2012														*
 * 																								*
 * Klasy: Wezel - przechowuje informacje dotyczące położenia węzła w postaci drzewa.			*
 * 				Potrafi wygenerować kod html wyświetlający jeden element drzewa					*
 * Korzysta z obiektów klas: Uzytkownik_class													*
 * 																								*
 * Lokalizacja pliku: klasy/wezel.php															*
 * 																								*
 ************************************************************************************************/

require_once 'osoba.php';
require_once 'bazaDanych.php';
require_once 'uzytkownik_class.php';
require_once 'drzewo.php';

	class Wezel
	{
		private $id;		//int
		private $rodzic;	//Wezel
		private $dzieci;	//array
		private $partner;	//Wezel
		private $moderator;	//string
		private $osoba;		//Osoba
		private $uzytkownik=null;	//jeśli węzeł jest użytkownikiem to będzie ustawione
		private $wDrzewie=false;	//jeśli węzeł jest elementem drzewa to będzie możliwość rozbudowy drzewa poprzez dodawanie węzłów (dodatkowe linki)
		
		public static $maxRoznPokolen=80;
		public static $minRoznPokolen=10;
		public static $roznicaWiekuPartnerow=50;
		
		public function setWDrzewie($wDrzewie)	{ $this->wDrzewie=$wDrzewie; }
		public function setUzytkownik($uzytkownik) { $this->uzytkownik=$uzytkownik; }
		public function getUzytkownik() { return $this->uzytkownik; }
		public function getId() { return $this->id; }
		public function getRodzic() { return $this->rodzic; }
		public function getDzieci() { return $this->dzieci; }
		public function getPartner() { return $this->partner; }
		public function getModerator() { return $this->moderator; }
		public function getOsoba() { return $this->osoba; }
		
		public function __construct($id, $partner, $moderator, Osoba $osoba)
		{
			$this->id = $id;
			$this->rodzic = null;
			$this->dzieci = array();
			$this->partner = $partner;
			$this->moderator = $moderator;
			$this->osoba = $osoba;
			if($this->partner!==null)			//powiazanie partnera z tym obiektem
				$this->partner->partner=$this;
		}
		
		public function add(Wezel $w)
		{
			$this->dzieci[] = $w;
			$w->rodzic=$this;
		}
		
		//do testów
		public function __toString()
		{
			$w=$this->osoba->__toString();
			if($this->partner!==null)
				$w.=' i '.$this->partner->osoba->__toString();
			if($this->osoba->getPlec())
			{
				$dzie=$this->dzieci;
			}
			else
			{
				$dzie=$this->partner->dzieci;
			}
				
			if(!empty($dzie))
			{
				$w=$w.'(';
				foreach($dzie as $dz)
				{
					$w=$w.$dz->__toString().', ';
				}
				$w=substr($w, 0, -2);
				$w=$w.')';
			}
			return $w;
			
		}
		
		public function naHtmlCalosc($ogladajacy)
		{
			if($this->osoba->getPlec())
				$klasa='mezczyzna';
			else
				$klasa='kobieta';
			
			$w='<div class="wezelCalosc '.$klasa.'">';
			//zdjecie w szczegolach widoku osoby
			$sciezka = 'obrazki/'. $this->getId().'.jpeg';
				if(file_exists($sciezka))
					$w.= '<img width ="100px" height="100px" src="'.$sciezka .'"/>';
				else
					$w.= '<img src="obrazki/miniaturka.png"/>';

			$w.='<div>Imię: '.$this->osoba->getImie().'</div>
			<div>Nazwisko: '.$this->osoba->getNazwisko().'</div>';
			if(!$this->osoba->getPlec() && $this->osoba->getNazwPanien()!=null)
				$w.='<div>Nazwisko panieńskie: '.$this->osoba->getNazwPanien().'</div>';
			
			if($this->osoba->getDataUrodzenia()!==null)		//jeśli jest data urodzenia to wyświetl
				$w.='<div>Data urodzenia: '.$this->osoba->getDataUrodzenia().'</div>';
			if($this->osoba->getDataSmierci()!==null)		//jeśli jest data urodzenia to wyświetl
				$w.='<div>Data śmierci: '.$this->osoba->getDataSmierci().'</div>';
			$w.='<div>Płeć: '.($this->osoba->getPlec() ? 'mężczyzna' : 'kobieta').'</div>';
			
			if($this->osoba->getNotatka()!=null)
				$w.='<p>'.nl2br($this->osoba->getNotatka()).'</p>';
			
			
			
			$w.='</div>';
			
			return $w;
		}
		
		public function naHtml($ogladajacy)
		{
			if($this->osoba->getPlec())
				$klasa='mezczyzna';
			else
				$klasa='kobieta';
			
			$w='<div class="wezel '.$klasa.'">';
			
			
			//zdjecie w szczegolach widoku osoby
			$sciezka = 'obrazki/'. $this->getId().'.jpeg';
				if(file_exists($sciezka))
					$w.= '<img width ="100px" height="100px" src="'.$sciezka .'"/>';
				else
					$w.= '<img src="obrazki/miniaturka.png"/>';
			
			
			
			$w.= '<div><a href="?node='.$this->id.'">'.$this->osoba->getImie().'</a></div>
			<div><a href="?node='.$this->id.'">'.$this->osoba->getNazwisko().'</a></div>';
			
			if($this->osoba->getDataUrodzenia()!==null)		//jeśli jest data urodzenia to wyświetl
			{
				$w.='<div class="dataUr">';
				$w.=$this->osoba->getDataUrodzenia();
				
				if($this->osoba->getDataSmierci()!==null)
					$w.=' - '.$this->osoba->getDataSmierci();
				$w.='</div>';
			}
			
			$moznaDodacRodzicow=false;
			if($this->rodzic==null)							//sprawdzenie czy można dodać rodziców
			{
			
				if($this->partner!=null)					//rozpatrzenie przypadku kiedy rodzic może nie być wyświetlany
				{											//w danym drzewie
					$baza=new BazaDanych();
					if($baza->zwrocRodzica($this->id)==null)
						$moznaDodacRodzicow=true;
				}
				else
				{
					$moznaDodacRodzicow=true;
				}
			}
			
			if($this->rodzic==null && !$moznaDodacRodzicow || !$this->wDrzewie)
				$w.='<div><a href="?tree&id='.$this->id.'">Pokaż drzewo</a></div>';
			
			if($this->wDrzewie)
			{
				//linki do dodawania węzłów
				$dPartneraLink='?tree&form=dodajPartnera&id='.$this->id;
				$dDzieckoLink='?tree&form=dodajDziecko&id='.$this->id;;
				$dRodzicowLink='?tree&form=dodajRodzicow&id='.$this->id;
					
				if($this->partner==null)						//dodawanie partnera link
				{
					$w.='<div><a href="'.$dPartneraLink.'">Dodaj '.($this->osoba->getPlec() ? 'żonę' : 'męża').'</a></div>';
				}
				else 											//dodawanie dziecka link
				{
					$w.='<div><a href="'.$dDzieckoLink.'">Dodaj dziecko</a></div>';
				}
				if($moznaDodacRodzicow)
					$w.='<div><a href="'.$dRodzicowLink.'">Dodaj rodziców</a></div>';
			}
			
		//odrywanie, usuwanie i edycja węzła
			$user=new Uzytkownik_class();
			if($ogladajacy==$this->getModerator() || $user->CzyAdmin($ogladajacy))
			{
				$idUsuwanego=$idEdytowanego=$idOdrywanego=$this->id;
				if($this->uzytkownik===null)
					$w.='<div><a href="?tree&akcja=usunWezel&id='.$idUsuwanego.'">Usuń</a></div>';
				$w.='<div><a href="?tree&form=edytujWezel&id='.$idEdytowanego.'">Edytuj</a></div>';
				$w.='<div><a href="?tree&akcja=oderwijWezel&id='.$idOdrywanego.'">Oderwij</a></div>';
			}
			
			if($this->uzytkownik!==null && $this->uzytkownik!==$ogladajacy)
				$w.='<div><a href="?o=wiadomosci&a=n_wiadomosc&do='.$this->uzytkownik.'">Napisz wiadomość</a></div>';
			
			$w.='</div>';
			
			return $w;
		}
		
		public function mozeBycRodzicem(Wezel $dziecko)
		{
			if($this->partner===null)	return false;											//musi mieć partnera
			$rud=$dziecko->osoba->getRokUr();
			if($this->osoba->getRokUr()>$this->partner->osoba->getRokUr())
			{
				$mr=$this->partner->osoba->getRokUr();
				$wr=$this->osoba->getRokUr();
			}
			else
			{
				$mr=$this->osoba->getRokUr();
				$wr=$this->partner->osoba->getRokUr();
			}
			if(($rud-$wr)<Wezel::$minRoznPokolen || ($rud-$mr)>Wezel::$maxRoznPokolen)	return false;	//roznica pokolen musi być z okreslonego przedziału
			if($this->czyWJednymDrzewie($dziecko))	return false;						//nie mogą występować w jednym drzewie
			
			return true;
		}
		
		public function mozeBycPartnerem(Wezel $partner)
		{
			if($this->partner!==null)	return false;									//nie może mieć partnera
			if($this->osoba->getPlec()==$partner->osoba->getPlec())	return false;		//nie może być tej samej płci
			if(abs($this->osoba->getRokUr()-$partner->osoba->getRokUr())>Wezel::$roznicaWiekuPartnerow)	return false;	//różnica wieku nie może przekraczać pewnej wartości
			if($this->czyWJednymDrzewie($partner))	return false;						//nie mogą występować w jednym drzewie
			
			return true;
		}
		
		public function mozeBycDzieckiem(Wezel $rodzic1, $rodzic2=null)
		{
			if($rodzic2===null)
			{
				if($rodzic1->getPartner()===null)	return false;
				else
					$rodzic2=$rodzic1->getPartner();
			}
				
			$rud=$this->osoba->getRokUr();
			if($rodzic1->osoba->getRokUr()>$rodzic2->osoba->getRokUr())
			{
				$mr=$rodzic2->osoba->getRokUr();
				$wr=$rodzic1->osoba->getRokUr();
			}
			else
			{
				$mr=$rodzic1->osoba->getRokUr();
				$wr=$rodzic2->osoba->getRokUr();
			}
			if(($rud-$wr)<Wezel::$minRoznPokolen || ($rud-$mr)>Wezel::$maxRoznPokolen)	return false;	//roznica pokolen musi być z okreslonego przedziału
			$baza=new BazaDanych();
			if($baza->zwrocRodzica($this->id)!==null)		return false;		//nie możę już mieć rodzica
			if($this->czyWJednymDrzewie($rodzic1))	return false;						//nie mogą występować w jednym drzewie
			
			return true;
		}
		
		//sprawdzenie czy ten węzeł i węzeł podany jako parametr występują w jednym drzewie
		private function czyWJednymDrzewie(Wezel $wezel)
		{
			if($this->id<0 || $wezel->getId()<0)	return false;
			$baza=new BazaDanych();
			$rodzic=$baza->zwrocRodzica($this->id);
			if($this->partner===null && $rodzic===null)	return false;
			
			$drzewo=new Drzewo($this->id);
			$drzewoWezla=new Drzewo($wezel->getId());
			if(in_array($wezel->getId(), $drzewo->getWezlyId()) || in_array($this->id, $drzewoWezla->getWezlyId()) )
				return true;
			
			if($this->partner!==null)
			{
				$drzewo=new Drzewo($this->partner->getId());
				if(in_array($wezel->getId(), $drzewo->getWezlyId()))
					return true;
			}
			if($wezel->getPartner()!==null)
			{
				$drzewoWezla=new Drzewo($wezel->getPartner()->getId());
				if(in_array($this->id, $drzewoWezla->getWezlyId()))
					return true;
			}
			
			return false;
		}
		
		

	}
	

?>